#ifndef ABSTRACTQUERY_H_INCLUDED
#define ABSTRACTQUERY_H_INCLUDED
#include "DataRow.h"
class AbstractDatabase;
typedef AbstractDatabase* PDatabase;

/**
* Abstrakte Query Klasse für das Senden von SQL-Befehlen an die jeweilige Datenbank.
**/
class AbstractQuery {
public:

    /**
    * Konstruktor für die AbstractQuery Klasse.
    **/
	AbstractQuery(PDatabase dbc, PString database, PString sqlQuery);

	/**
	* Destruktor der AbstractQuery Klasse.
	**/
	virtual ~AbstractQuery();

    /**
    * Gibt true zurück wenn noch mehr Zeilen da sind. Diese Methode ist auch für das Freigeben des Speichers, der letzten PDataRow Klasse zuständig die mit fetch() geholt wurde.
    **/
	bool hasMore();

    /**
	* Abstrakte Methode. Die Aufgabe der Methode soll das zurückgeben einer Ergebniszeile.
	**/
	virtual PDataRow fetch()  =  0;

    /**
    * Gibt die Anzahl der gefundenen Tabellenzeilen zurück
    **/
	size_t getNumRows();
protected:
    PDatabase dbc;
    PDataRow datarow;

	PString sqlQuery;
	PString database;

	size_t current_row;
	size_t num_rows;

};

/**
* Erstelle neuen Type PQuery der auf eine AbstractQuery-Klasse zeigt.
**/
typedef AbstractQuery* PQuery;


#endif // ABSTRACTQUERY_H_INCLUDED
